package com.topscomm.file.convert.factory;

import java.io.File;
import java.io.InputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.topscomm.basic.exception.ServiceException;
import com.topscomm.core.FileFormatEnum;
import com.topscomm.core.FileTypeEnum;
import com.topscomm.file.convert.IFileConvertService;
import com.topscomm.file.util.FileUtil;

/**
 * 文件转换工厂服务类
 * 
 * @description:
 * @author: donghang
 * @date: 2021年3月16日下午2:10:46
 * @modify:
 */
public class FileConvertFactoryService {
	private Map<FileTypeEnum, IFileConvertService> convertServiceMap = new ConcurrentHashMap<>();

	public FileConvertFactoryService() {
	}

	/**
	 * 添加文件服务
	 * 
	 * @description:
	 * @param fileStoreTypeEnum
	 * @param storeService
	 * @author: donghang
	 * @date: 2021年3月14日下午10:11:25
	 * @modify:
	 */
	public void addConvertService(FileTypeEnum fileTypeEnum, IFileConvertService fileConvertService) {
		convertServiceMap.put(fileTypeEnum, fileConvertService);
	}

	/**
	 * 转换文件
	 * 
	 * @description:
	 * @param filePath
	 * @param targetPath
	 * @return
	 * @author: donghang
	 * @throws Exception
	 * @date: 2021年3月17日上午9:55:04
	 * @modify:
	 */
	public String convertFile(String identifier, String filePath, String targetPath) throws Exception {
		IFileConvertService fileConvertService = this.choose(filePath);
		if (fileConvertService == null) {
			throw new ServiceException("找不到该文件的格式转换器！");
		}
		return fileConvertService.convertFile(identifier, filePath, targetPath);
	}

	/**
	 * 通过路径转换文件格式
	 * 
	 * @description:
	 * @param filePath
	 * @param targetPath
	 * @param targetFileFormat目标文件格式
	 * @return
	 * @author: donghang
	 * @date: 2021年3月15日下午6:53:17
	 * @modify:
	 */
	public String convertFile(String identifier, String filePath, String targetPath, FileFormatEnum targetFileFormat)
			throws Exception {
		IFileConvertService fileConvertService = this.choose(filePath);
		if (fileConvertService == null) {
			throw new ServiceException("找不到该文件的格式转换器！");
		}
		return fileConvertService.convertFile(identifier, filePath, targetPath, targetFileFormat);
	}

	/**
	 * 
	 * @description:
	 * @param inputStream
	 * @param fileName
	 * @param targetFileFormat
	 * @return
	 * @author: donghang
	 * @date: 2021年3月15日下午6:53:40
	 * @modify:
	 */
	public String convertFile(String identifier, InputStream inputStream, String fileName,
			FileFormatEnum targetFileFormat) {
		return this.convertFile(identifier, inputStream, fileName, targetFileFormat);
	}

	/**
	 * 转换文件封面
	 * 
	 * @description:
	 * @param filePath
	 * @param targetPath
	 * @return
	 * @author: donghang
	 * @date: 2021年4月8日下午5:16:41
	 * @modify:
	 */
	public String convertFileTitlePages(String identifier, String filePath, String targetPath) {
		IFileConvertService fileConvertService;
		try {
			fileConvertService = this.choose(filePath);
		} catch (Exception e) {
			throw new ServiceException("找不到该文件的格式转换器！");
		}
		File file = new File(filePath);
		String fileName = file.getName();
		String name = fileName.substring(0, fileName.lastIndexOf("."));
		return fileConvertService.getFileEnvelope(identifier, filePath, targetPath, name);
	}

	/**
	 * 根据文件信息得到相关的文件服务类
	 * 
	 * @description:
	 * @param fileId
	 * @return
	 * @author: donghang
	 * @date: 2021年3月16日下午5:55:25
	 * @modify:
	 */
	private IFileConvertService choose(String filePath) throws Exception {
		// 判断是否需要分片，只有音频、视频分片
		String mimeType = FileUtil.getMimeType(filePath).toLowerCase();
		if (FileUtil.matchMimeType(mimeType, FileFormatEnum.AUDIO.mimeType)
				|| FileUtil.matchMimeType(mimeType, FileFormatEnum.VIDEO.mimeType)) {
			return convertServiceMap.get(FileTypeEnum.AUDIOVIDEO);
		} else if (FileUtil.matchMimeType(mimeType, FileFormatEnum.EXCEL.mimeType)
				|| FileUtil.matchMimeType(mimeType, FileFormatEnum.PPT.mimeType)
				|| FileUtil.matchMimeType(mimeType, FileFormatEnum.WORD.mimeType)
				|| FileUtil.matchMimeType(mimeType, FileFormatEnum.PDF.mimeType)) {
			return convertServiceMap.get(FileTypeEnum.OFFICE);
		} else {
			return null;
		}
	}
}
